package com.ruyuan.rapid.core.netty.processor.filter;

import com.ruyuan.rapid.core.context.Context;
import com.ruyuan.rapid.core.helper.ResponseHelper;

/**
 * 抽象的带有链表形式的过滤器
 * @author mac
 */
public abstract class AbstractLinkedProcessorFilter<T> implements ProcessorFilter<Context> {

    /**
     * 链表必须要有下一个元素的引用
     */
    protected AbstractLinkedProcessorFilter<T> next = null;

    public void setNext(AbstractLinkedProcessorFilter<T> next) {
        this.next = next;
    }

    public AbstractLinkedProcessorFilter<T> getNext() {
        return next;
    }

    @Override
    public void fireNext(Context ctx, Object... args) throws Throwable {
        // 生命周期的作用
        if (ctx.isTerminated()) {
            return;
        }
        if (ctx.isWritten()) {
            ResponseHelper.writeResponse(ctx);
        }
        if (next != null) {
            if (!next.check(ctx)) {
                next.fireNext(ctx, args);
            } else {
                next.transformEntry(ctx, args);
            }
        } else {
            // 链表末尾,无下一个节点
            ctx.terminated();
            return;
        }
    }

    @Override
    public void transformEntry(Context ctx, Object... args) throws Throwable {
        // 这里就是真正执行下一个节点的操作
        entry(ctx, args);
    }
}
